<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>5.class声明的方法为什么不能遍历</title>
</head>

<body>
  <script>
    /*
    class 是使用函数声明类的语法糖，但也有些区别

    class 中定义的方法不能枚举

    */

    class User {
      constructor(name) {
        this.name = name;
      }
      show () {
        console.log(this.name);
      }
    }
    let xj = new User("向军");
    //show 的属性特征 已经被设置为不可遍历了 enumerable": false
    console.log(JSON.stringify(Object.getOwnPropertyDescriptor(User.prototype, "show"), null, 2));

    //不会枚举出show属性
    for (const key in xj) {
      console.log(key);
    }
    // name

    // 构造函数生成对象
    function Hd (name) {
      this.name = name;
    }
    // show 方法的特征是允许被遍历的
    Hd.prototype.show = function () {
      console.log(this.name);
    };
    let obj = new Hd("后盾人");
    //enumerable 属性为true ，设置为false 才能屏蔽遍历
    console.log(JSON.stringify(Object.getOwnPropertyDescriptor(Hd.prototype, "show"), null, 2));

    for (const key in obj) {
      console.log(key);
      // 只遍历对象本身的属性，show 方法就不会被遍历出来了
      /* if(obj.hasOwnProperty(key)){
        console.log(key);
      }*/
    }
      // name, show
  </script>
</body>

</html>